package cn.itcast.wanxinp2p.account.service.impl;

import cn.itcast.wanxinp2p.account.common.AccountErrorCode;
import cn.itcast.wanxinp2p.account.domain.Account;
import cn.itcast.wanxinp2p.account.mapper.AccountMapper;
import cn.itcast.wanxinp2p.account.service.AccountService;
import cn.itcast.wanxinp2p.api.account.model.AccountDTO;
import cn.itcast.wanxinp2p.api.account.model.AccountLoginDTO;
import cn.itcast.wanxinp2p.api.account.model.AccountRegisterDTO;
import cn.itcast.wanxinp2p.common.domain.ErrorCode;
import cn.itcast.wanxinp2p.common.domain.RestResponse;
import cn.itcast.wanxinp2p.common.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.dromara.hmily.common.utils.IdWorkerUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@Service
public class AccountServiceImpl implements AccountService {

    @Value("${sms.enable}")
    private boolean enable;
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private AccountMapper accountMapper;
    @Override
    public RestResponse getSMSCode(String mobile) {
    	//TODO
        // 发起远程请求调用 短信微服务 发送短信   RestTemplate
        // http://localhost:56085/sailing/generate?effectiveTime=300&name=sms
        // {"mobile":"13566668888"}

        /*返回数据：直接将短信服务的结果返回即可
            {
                "code": 0,
                "msg": "",
                "result": {
                    "key": "sms:70ba933b095b4b5c90ee314045fd9003",
                    "content": null
                }
            }
         */
        HashMap<Object, Object> map = new HashMap<>();
        map.put("mobile",mobile);
        String url = "http://localhost:56085/sailing/generate?effectiveTime=300&name=sms";
        return restTemplate.postForObject(url,map, RestResponse.class);

    }

    @Override
    public Integer checkMobile(String mobile, String key, String code) {
          /* 1、远程调用 短信微服务 校验验证码是否正确
              Post请求：
              http://localhost:56085/sailing/verify?name=sms&verificationKey=sms:70ba933b095b4b5c90ee314045fd9003&verificationCode=707339
              根据解决判断验证码校验是否成功
            2、如果验证码正确，还需要根据手机号 去 account 表中查询手机号是否存在，如果不存在，给前端返回错误信息
        smsService.verifySmsCode(key,code);
        int count = accountMapper.countByMobile(mobile);
        return count>0 ? 1:0;
        */
        String url = "http://localhost:56085/sailing/verify?name=sms&verificationKey="+key+"&verificationCode="+code;
        RestResponse<Boolean> restResponse = restTemplate.postForObject(url, null, RestResponse.class);
        if(!restResponse.getResult()){
            return 0;
        }
        int count = accountMapper.countByMobile(mobile);
        return count>0? 1:0;
    }

    /**
     * 账户注册
     * @param registerDTO 注册信息
     * @return
     */
    @Override
    public AccountDTO register(AccountRegisterDTO registerDTO) {
        //TODO
        Account account = new Account();
        int count = accountMapper.countByMobile(registerDTO.getMobile());
        if(count == 1){
            throw new BusinessException(AccountErrorCode.E_130101);
        }
        BeanUtils.copyProperties(registerDTO,account);
        account.setDomain("c");
        account.setStatus(1);

        accountMapper.insert(account);
        AccountDTO accountDTO = new AccountDTO();
        BeanUtils.copyProperties(account,accountDTO,"password");
        return accountDTO;

    }

    @Override
    public AccountDTO login(AccountLoginDTO accountLoginDTO) {
        //1、查询用户，注意此处需要根据前端传递的 AccountLoginDTO的domain做判断：
        //  如果值是 c 表示是c端用户，需要根据手机号查询
        //  否则是b端用户，需要根据用户名查询
        if(accountLoginDTO.getDomain().equals("c")){
            Account account = accountMapper.selectByMobile(accountLoginDTO.getMobile());
            if(account == null){
                throw new BusinessException(AccountErrorCode.E_130104);
            }else{
                if(enable){
                    AccountDTO accountDTO = new AccountDTO();
                    BeanUtils.copyProperties(account,accountDTO);
                    return accountDTO;
                }else{
                    String password = accountLoginDTO.getPassword();
                    if(password != null&&password.equals(account.getPassword())){
                        AccountDTO accountDTO = new AccountDTO();
                        BeanUtils.copyProperties(account,accountDTO);
                        return accountDTO;
                    }else{
                        throw new BusinessException(AccountErrorCode.E_130105);
                    }
                }
            }
        }else{
            Account account = accountMapper.selectByUserName(accountLoginDTO.getUsername());
            if(account == null){
                throw new BusinessException(AccountErrorCode.E_130104);
            }else{
                if(enable){
                    AccountDTO accountDTO = new AccountDTO();
                    BeanUtils.copyProperties(account,accountDTO);
                    return accountDTO;
                }else{
                    String password = accountLoginDTO.getPassword();
                    if(password != null&&password.equals(account.getPassword())){
                        AccountDTO accountDTO = new AccountDTO();
                        BeanUtils.copyProperties(account,accountDTO);
                        return accountDTO;
                    }else{
                       throw new BusinessException(AccountErrorCode.E_130105);
                    }
                }
            }
        }

        //2、判断用户是否存在，如果不存在，直接抛出 AccountErrorCode.E_130104 异常

        //3、如果 smsEnable=true ，说明是短信验证码登录，不做密码校验。直接返回

        //4、验证密码，如果密码错误则抛出 AccountErrorCode.E_130105 异常
    }
}